home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GEM / FASTGEM0.I < prev    next >
Encoding:
Text File  |  1990-10-09  |  8.7 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE FastGEM0;(*Y+*)⓪ ⓪ ⓪ (*  --------------------------------------------------------------------------⓪!*  System-Version: MOS 1.1⓪!*  --------------------------------------------------------------------------⓪!*  Version       : 0.01⓪!*  --------------------------------------------------------------------------⓪!*  Text-Version  : V#0008⓪!*  --------------------------------------------------------------------------⓪!*  Modul-Holder  : Manuel Chakravarty⓪!*  --------------------------------------------------------------------------⓪!*  Copyright July 1988 by Manuel Chakravarty⓪!*  Vertriebsrechte für ATARI ST unter MEGAMAX Modula-2⓪!*                  liegen bei Application Systems Heidelberg⓪!*  --------------------------------------------------------------------------⓪!*  MCH : Manuel Chakravarty⓪!*  --------------------------------------------------------------------------⓪!*  Datum    Autor  Version  Bemerkung (Arbeitsbericht)⓪!*⓪!*  14.08.89 MCH    V0.01    Urversion; 'CopyOpaque' impl. + def.⓪!*  --------------------------------------------------------------------------⓪!*  Modul-Beschreibung:⓪!*⓪!*  Dies Modul stellt eine schnelle Kopierfunktion für beliebige Bildschirm-⓪!*  bereiche zur Verfügung.⓪!*⓪!*  --------------------------------------------------------------------------⓪!*)⓪ ⓪ (*  =========== ZU TUN: ==============⓪!*⓪!*  -- Überprüfen, ob die Routinen immer VDI aufrufen, wenn die ASM-Routine⓪!*     versagt.⓪!*⓪!*  =========== DOCU: ================⓪!*⓪!*)⓪ ⓪ ⓪ FROM SYSTEM     IMPORT ASSEMBLER, BYTE, ADDRESS;⓪ ⓪ FROM GrafBase   IMPORT Rectangle, BitOperation, PtrMemFormDef, MemFormDef,⓪7GetBlitterMode, GetScreen;⓪ ⓪ FROM GEMEnv     IMPORT DeviceHandle;⓪ ⓪ IMPORT VDIRasters;⓪ ⓪ ⓪ TABLE.W masks:  $FFFF, $7FFF, $3FFF, $1FFF,     (*  Tabelle für 'copyOpaque'  *)⓪0$0FFF, $07FF, $03FF, $01FF,⓪0$00FF, $007F, $003F, $001F,⓪0$000F, $0007, $0003, $0001;⓪0⓪((*    wortbreite, planes  *)            (*  Bildschirmauflösungen  *)⓪(⓪(rez:     80,      4,        (*  Low-Res  *)⓪180,      2,        (*  Mid-Res  *)⓪140,      1;        (*  High-Res  *)⓪(⓪ PROCEDURE CopyOpaque (dev        : DeviceHandle;⓪6sourceMem,⓪6destMem    : PtrMemFormDef;⓪6sourceFrame,⓪6destFrame  : Rectangle;⓪6mode       : BitOperation);⓪6⓪"VAR   screenAddr      : ADDRESS;⓪(words, planes   : CARDINAL;⓪(wordAlign       : BYTE;⓪ ⓪"PROCEDURE longCopy;⓪"⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(TST.W   sourceFrame.w(A6)⓪(BPL     ok1⓪(CLR.W   sourceFrame.w(A6)⓪ ok1⓪(TST.W   sourceFrame.h(A6)⓪(BPL     ok2⓪(CLR.W   sourceFrame.h(A6)⓪ ok2⓪ ⓪(MOVEM.L D3-D7/A3-A5,-(A7)⓪(⓪(MOVE.W  planes(A6),A3   ; Anzahl Randwörter links -> A3⓪(MOVE.W  A3,A4           ; Anzahl Randwörter rechts -> A4⓪(⓪(MOVE.W  sourceFrame.x(A6),D0⓪(MOVE.W  D0,D2⓪(ANDI.W  #$F,D0⓪(MOVE.W  #16,D7⓪(SUB.W   D0,D7⓪(MOVE.W  D7,-(A7)        ; Anzahl linke Randbits merken (Stack)⓪(ADD.W   D0,D0⓪(LEA     masks,A0⓪(MOVE.L  A0,A1⓪(ADDA.W  D0,A0⓪(MOVE.W  (A0),D1         ; Linke Kopiermaske -> D1⓪(MOVE.W  D1,D3⓪(NOT.W   D3              ; Linke negierte Kopiermaske -> D3⓪(⓪(ADD.W   sourceFrame.w(A6),D2⓪(ANDI.W  #$F,D2⓪(MOVE.W  D2,-(A7)        ; Anzahl rechte Randbits merken (Stack)⓪(ADD.W   D2,D2⓪(ADDA.W  D2,A1⓪(MOVE.W  (A1),D4         ; Rechte negierte Kopiermaske -> D4⓪(MOVE.W  D4,D2⓪(NOT.W   D2              ; Rechte Kopiermaske -> D2⓪(BNE     c⓪(CLR.W   (A7)            ; Keine rechten Randbits merken⓪(MOVE.W  #0,A4           ; Rechts ist Wortgrenze => Keine Maske nötig⓪ c⓪(⓪(MOVE.W  sourceFrame.w(A6),D0⓪(SUB.W   (A7)+,D0        ; Randbits abziehen⓪(SUB.W   (A7)+,D0⓪(BPL     c2⓪(AND.W   D2,D1⓪(OR.W    D4,D3⓪(MOVE.W  #0,A4⓪(CLR.W   D0⓪ c2⓪(LSR.W   #4,D0⓪(MULU.W  planes(A6),D0⓪(MOVE.W  D0,D7⓪(ADD.W   A3,D7⓪(ADD.W   A4,D7⓪(MOVE.W  words(A6),A5⓪(SUBA.W  D7,A5⓪(ADDA.W  A5,A5           ; Zeilenoffset in Byte -> A5⓪(MOVE.W  D7,-(A7)        ; Anzahl pro Zeile zu kopierende Words -> Stack⓪(LSR.W   #1,D0⓪(SCS     wordAlign(A6)   ; wordAlign-Flag -> 'wordAlign'⓪(MOVE.W  D0,A2           ; Anzahl Longs pro Zeile -> A2⓪(⓪(MOVE.W  sourceFrame.h(A6),D5    ; Anzahl Zeilen -> D5⓪(⓪(;       Startaddressenberechnung⓪(⓪(MOVE.W  sourceFrame.y(A6),D0⓪(MULU.W  words(A6),D0⓪(ADD.W   D0,D0⓪(MOVEQ   #0,D7⓪(MOVE.L  D7,A0⓪(MOVE.W  D0,A0⓪(MOVE.W  sourceFrame.x(A6),D0⓪(LSR.W   #3,D0⓪(AND.W   #$FE,D0⓪(ADDA.W  D0,A0⓪(ADDA.L  screenAddr(A6),A0       ; sourceAddr -> A0⓪(⓪(MOVE.W  destFrame.y(A6),D0⓪(MULU.W  words(A6),D0⓪(ADD.W   D0,D0⓪(MOVEQ   #0,D7⓪(MOVE.L  D7,A1⓪(MOVE.W  D0,A1⓪(MOVE.W  destFrame.x(A6),D0⓪(LSR.W   #3,D0⓪(AND.W   #$FE,D0⓪(ADDA.W  D0,A1⓪(ADDA.L  screenAddr(A6),A1       ; destAddr -> A1⓪(⓪(CMPA.L  A0,A1⓪(BCS.W   forward⓪(⓪(;       --- Kopie RÜCKWÄRTS ---⓪(⓪(MOVE.W  sourceFrame.h(A6),D0⓪(SUBQ.W  #1,D0⓪(MULU.W  words(A6),D0⓪(ADD.W   (A7)+,D0        ; Anzahl zu kopierende Wörter pro Zeile add.⓪(ADD.W   D0,D0⓪(ADDA.W  D0,A0⓪(ADDA.W  D0,A1⓪(⓪(BRA     startBack       ; Start Kopierschleife (rückwärts)⓪ lBack⓪(MOVE.W  A4,D0           ; Start rechte Maske⓪(BRA     sBRight⓪ lBRight⓪(MOVE.W  -(A1),D6⓪(AND.W   D4,D6⓪(MOVE.W  -(A0),D7⓪(AND.W   D2,D7⓪(OR.W    D6,D7⓪(MOVE.W  D7,(A1)⓪ sBRight⓪(DBF     D0,lBRight⓪(⓪(TST.B   wordAlign(A6)   ; Start Align⓪(BEQ     noAlignB⓪(MOVE.W  -(A0),-(A1)⓪ noAlignB⓪ ⓪(MOVE.W  A2,D0           ; Start kopiere Longs⓪(BRA     sBLongs⓪ lBLongs⓪(MOVE.L  -(A0),-(A1)⓪ sBLongs⓪(DBF     D0,lBLongs⓪(⓪(MOVE.W  A3,D0           ; Start linke Maske⓪(BRA     sBLeft⓪ lBLeft⓪(MOVE.W  -(A1),D6⓪(AND.W   D3,D6⓪(MOVE.W  -(A0),D7⓪(AND.W   D1,D7⓪(OR.W    D6,D7⓪(MOVE.W  D7,(A1)⓪ sBLeft⓪(DBF     D0,lBLeft⓪ ⓪(SUBA.W  A5,A0           ; Addr. der nächsten Zeile ermittlen⓪(SUBA.W  A5,A1⓪ startBack⓪(DBF     D5,lBack⓪(⓪(BRA     ende⓪(⓪(;       --- Kopie VORWÄRTS ---⓪(⓪ forward⓪(ADDQ.L  #2,A7           ; A7 bereinigen⓪(BRA     startFore       ; Start Kopierschleife (vorwärts)⓪ lFore⓪(MOVE.W  A3,D0           ; Start linke Maske⓪(BRA     sFLeft⓪ lFLeft⓪(MOVE.W  (A1),D6⓪(AND.W   D3,D6⓪(MOVE.W  (A0)+,D7⓪(AND.W   D1,D7⓪(OR.W    D6,D7⓪(MOVE.W  D7,(A1)+⓪ sFLeft⓪(DBF     D0,lFLeft⓪(⓪(TST.B   wordAlign(A6)   ; Start Align⓪(BEQ     noAlignF⓪(MOVE.W  (A0)+,(A1)+⓪ noAlignF⓪ ⓪(MOVE.W  A2,D0           ; Start kopiere Longs⓪(BRA     sFLongs⓪ lFLongs⓪(MOVE.L  (A0)+,(A1)+⓪ sFLongs⓪(DBF     D0,lFLongs⓪(⓪(MOVE.W  A4,D0           ; Start linke Maske⓪(BRA     sFRight⓪ lFRight⓪(MOVE.W  (A1),D6⓪(AND.W   D4,D6⓪(MOVE.W  (A0)+,D7⓪(AND.W   D2,D7⓪(OR.W    D6,D7⓪(MOVE.W  D7,(A1)+⓪ sFRight⓪(DBF     D0,lFRight⓪ ⓪(ADDA.W  A5,A0           ; Addr. der nächsten Zeile ermittlen⓪(ADDA.W  A5,A1⓪ startFore⓪(DBF     D5,lFore⓪(⓪ ende⓪(MOVEM.L (A7)+,D3-D7/A3-A5⓪&END;⓪$END longCopy;⓪$(*$L=*)⓪ ⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L  #2,A7⓪(MOVE.L  A7,(A3)+⓪(SUBQ.L  #2,A7⓪(MOVE.L  A7,(A3)+⓪(JSR     GetBlitterMode⓪(MOVE.W  (A7)+,D0⓪(AND.W   (A7)+,D0⓪(BNE     vdiCopy         ; Springe, falls Blitter vorhanden + aktiv⓪(⓪(MOVE.W  mode(A6),D0⓪(CMP.W   #onlyS,D0⓪(BNE     vdiCopy         ; Springe, falls kein replace-mode⓪(⓪(MOVE.L  sourceMem(A6),A0⓪(MOVE.L  MemFormDef.start(A0),D0⓪(MOVE.L  destMem(A6),A0⓪(CMP.L   MemFormDef.start(A0),D0⓪(BEQ     cont⓪#⓪ vdiCopy⓪$END;⓪$VDIRasters.CopyOpaque (dev, sourceMem,destMem, sourceFrame, destFrame,⓪;mode);⓪$ASSEMBLER⓪(BRA     ende⓪"⓪ cont⓪(TST.L   D0⓪(BNE     mfdbValid⓪(⓪(;       Bildschirmaddresse und die Breite einer Scanzeile ermitteln⓪(⓪(SUBQ.L  #4,A7⓪(MOVE.L  A7,(A3)+⓪(SUBQ.L  #4,A7⓪(MOVE.L  A7,(A3)+⓪(SUBQ.L  #2,A7⓪(MOVE.L  A7,(A3)+⓪(JSR     GetScreen⓪(⓪(MOVE.W  (A7)+,D0⓪(LSL.W   #2,D0⓪(LEA     rez,A0⓪(ADDA.W  D0,A0⓪(MOVE.W  (A0)+,words(A6)⓪(MOVE.W  (A0),planes(A6)⓪(ADDQ.L  #4,A7⓪(MOVE.L  (A7)+,screenAddr(A6)⓪(BRA     cont3⓪(⓪(;       Werte aus MFDB übernehmen⓪(⓪ mfdbValid⓪(MOVE.L  D0,screenAddr(A6)⓪(MOVE.W  MemFormDef.words(A0),words(A6)⓪(MOVE.W  MemFormDef.planes(A0),planes(A6)⓪(⓪ cont3⓪(MOVE.W  sourceFrame.x(A6),D0⓪(ANDI.W  #$F,D0⓪(MOVE.W  destFrame.x(A6),D1⓪(ANDI.W  #$F,D1⓪(CMP.W   D0,D1⓪(BNE     vdiCopy⓪(CMPI.W  #1,planes(A6)⓪(BNE     vdiCopy⓪(BSR     longCopy⓪(⓪ ende⓪$END;⓪"END CopyOpaque;⓪ ⓪ ⓪ END FastGEM0.⓪ ə
  2. (* $FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$00001CBF$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95ü$00000027T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000006B7$00001CAF$000006FA$00000020$FFEC88E0$00002066$0000063D$000005E1$00000027$00002056$00002043$00000703$00000885$00000896$000006FA$0000064BñÇâ*)
  3.